package com.wdhcr.socket;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;

import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Hashtable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * @ServerEndpoint 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@CrossOrigin
@Component
@ServerEndpoint(value = "/websocket/{sceneId}")
public class WxWebSocketController {

    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话，可以使用Map来存放，其中Key可以为用户标识
    private static ConcurrentMap<String, WxWebSocketController> webSocketMap = new ConcurrentHashMap<String, WxWebSocketController>();
    //与某个客户端的连接会话，需要通过它来给客户端发送数据
    private Session session;
    private HttpSession httpSession;


    /**
     * @description: 连接建立成功调用的方法
     * @params: [sceneId, session] sceneId 唯一值（场景值）  session  可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
     * @return: void
     * @author: wdhcr
     * @dateTime: 2020/1/3 20:39
     */
    @OnOpen
    public void onOpen(@PathParam("sceneId") String sceneId, Session session) {
        this.session = session;

        webSocketMap.put(sceneId, this);
        //在线数加1
        System.out.println("唯一key为：" + sceneId);
    }

    /**
     * @description: 链接关闭调用的方法
     * @params: [sceneId]   sceneId 唯一值（场景值）
     * @return: void
     * @author: wdhcr
     * @dateTime: 2020/1/3 20:48
     */
    @OnClose
    public void onClose(@PathParam("sceneId") String sceneId) {
        webSocketMap.remove(sceneId);//从map中删除
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        Hashtable params = JSONObject.parseObject(message, Hashtable.class);
        //群发消息
        WxWebSocketController webSocketController = webSocketMap.get(params.get("equipmentType"));

        if (webSocketController != null) {
            try {
                webSocketController.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * @description: 发生错误时调用
     * @params: [session, error]
     * @return: void
     * @author: wdhcr
     * @dateTime: 2020/1/3 20:54
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
//        error.printStackTrace();
    }

    /**
     * @description: 自定义的方法，发送消息
     * @params: [message]
     * @return: void
     * @author: wdhcr
     * @dateTime: 2020/1/3 20:54
     */
    public void sendMessage(String message) throws IOException {
//        System.out.println("发送消息到前端了");
        this.session.getBasicRemote().sendText(message);
//        this.session.getAsyncRemote().sendText(message);
    }
    /**
     * @description: 处理用户扫描二维码过期问题的方法
     * @params: [requestMap]
     * @return: java.lang.String
     * @author: wdhcr
     * @dateTime: 2020/2/3 18:47
     */
//    public static String errprTextMessage(Map<String, String> requestMap) {
//        TextMessage tm = new TextMessage(requestMap, "你的二维码已过期，请刷新重试！！！");
//        return WxUtil.beanToXml(tm);
//
//    }

}
